<?php 
/**
 * Базовый класс описания микроданных для поисковиков
 * Описания полей для вывода микроданных находятся на http://schema.org/
 * Тип описываемых данных указан в каждом подклассе. (например класс Microdata_Hotel описывает LodgingBusiness, находящийся по адресу http://schema.org/LodgingBusiness)
 * 
 * Принцип работы: 
 * 1) приведение объекта к типу string выведет необходимые атрибуты для вставки определения (itemscope) в тег.
 * 2) для указания, что сейчас будет выведено свойство (атрибут тега itemprop) надо вызывать метод prop и передать имя свойства
 * 3) для вывода дополнительных свойств без вывода визуально, надо вызвать метод meta и передать имя свойства
 * 4) для вывода самого свойства надо просто обратиться к свойству объекта ->
 * 5) 1) и 2) можно комбинировать в пределах одного тега, например, когда свойство является сложным типом типа Microdata_XYZ
 * 
 * @author xStream
 * @version 1.0.0
 */


class Microdata_Base {
	const google_type = '';
	protected $valid = false;
	
	/**
	 * Приведение к строке
	 * @return string - атрибуты для тега, содержит описание типа объекта со schema.org
	 */
	final public function __toString() {
		if(get_called_class() == 'Microdata_Base') return '';
		
		if(!$this->valid()) return '';
		
		return ' itemscope itemtype="http://schema.org/' . static::google_type . '" ';
	}
	
	/**
	 * 
	 * @param string $property - имя свойства
	 * @return string - тег meta, содержит название свойства и его значение
	 */
	final public function meta($property) {
		
		if(!isset($this->{$property})) return '';
		
		if($this->{$property} instanceof Microdata_Base && !$this->{$property}->valid()) return '';

		return '<meta itemprop="' . $property . '" content="' . @$this->{$property} . '" />';
	}
	
	/**
	 * 
	 * @param string $property - имя свойства
	 * @return string - атрибут для тега, указывает содержимое тега
	 */
	final public function prop($property) {
		
		if(!isset($this->{$property})) return '';
		
		if($this->{$property} instanceof Microdata_Base && !$this->{$property}->valid()) return '';
		
		return ' itemprop="' . $property . '" ';
	}
	
	/**
	 * Возвращает false в случае, если данных нет или объект неправильно инициализирован.
	 * При использовании методов вывода атрибутов будут возвращаться пустые строки.
	 * 
	 * @return boolean
	 */
	final public function valid() {
		return $this->valid;
	}
}